package com.semidata.trp.decision.main;

import com.semidata.rtd.core.datasource.redis.RedisDataSourceService;
import com.semidata.rtd.core.http.server.HttpService;
import com.semidata.rtd.core.iplib.IpLibService;
import com.semidata.rtd.core.log.DefaultLogService;
import com.semidata.rtd.core.log.Logger;
import com.semidata.rtd.core.service.ServiceManager;
import com.semidata.rtd.engine.executor.TaskExecutor;
import com.semidata.trp.decision.bid.CompileService;
import com.semidata.trp.decision.business.BusinessService;
import com.semidata.trp.decision.config.Config;
import com.semidata.trp.decision.http.DecisionHttpDispatcher;

public class Main {

    private static Config config;

    public static void main(String[] args) {

        String configFile;
        if (args.length > 0) {
            configFile = args[0];
        } else {
            configFile = null;
        }

        try {
            Config.init(configFile);
        } catch (RuntimeException e) {
            System.err.println("can not load config file");
            return;
        }

        config = Config.getConfig();
        
        ServiceManager.register(new DefaultLogService(config.getLogRoot(), config.isLogDebugEnabled()));
        ServiceManager.register(new IpLibService(config.getIpLibFile()));
        ServiceManager.register(new BusinessService());
        ServiceManager.register(new CompileService());
        ServiceManager.register(new TaskExecutor(config.getTaskThreads()));
        ServiceManager.register(new RedisDataSourceService(Config.getConfig().getRedisHosts(), config.getRedisThreads(), config.getRedisConnectNum(), config.getRedisConnectTimeout()));
        ServiceManager.register(new HttpService(config.getHttpPort(), config.getHttpThreads(), new DecisionHttpDispatcher()));
  
        ServiceManager.startAll();
        Logger.log("DEBUG", "server started");
        ServiceManager.sync();        
    }

}

